#include "gomoku.h"
#include "ui_gomoku.h"


gomoku::gomoku(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::gomoku)
{
    ui->setupUi(this);
    initData();
}

gomoku::~gomoku()
{
    delete  ui;
}


void gomoku::initData()
{
    isBLACK=true;
    for(int i=0;i<15;i++)
        for(int j=0;j<15;j++)
            dat[i][j]=0;
    num=0;

}


void gomoku::mousePressEvent(QMouseEvent *event)
{
    QPoint point =event ->pos();
    qDebug()<<point.x()<<point.y();
    if(isChess) return ;
    int x=point.x();
    int y=point.y();
    x=(x-100)/30.0+0.5;
    y=(y-100)/30.0+0.5;

    if(dat[x][y]==0)
        if(num%2==0)
        {
            dat[x][y]=2;
            num++;
        }
        else {
            dat[x][y]=1;
            num++;
        }
    update();
    judgeResult(x,y);

}


void gomoku::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //1，初始化画笔和画刷
    QPen pen;
    pen.setColor(QColor(225,225,0));
    pen.setWidth(2);
    pen.setStyle(Qt::SolidLine);
    QBrush brush;
    brush.setColor(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    painter.setPen(pen);
    painter.setBrush(brush);//每次修改需要重新设置

    //绘制一个棋盘区域
    painter.drawRect(70,70,16*30,16*30);//绘制矩形
    pen.setColor(QColor(0,0,0));
    pen.setWidth(3);
    painter.setPen(pen);

    QFont font;
    font.setBold(true);
    font.setFamily("黑体");
    font.setPixelSize(30);
    painter.setFont(font);
    painter.drawText(280,50,"五子棋游戏");//绘制文本
    //16*16*30
    for(int i=0;i<15;i++)
    {

        painter.drawLine(100,100+30*i,100+14*30,100+30*i);
        painter.drawLine(100+30*i,100,100+30*i,100+14*30);
    }
    //绘制定位点
    painter.drawEllipse(100+30*3-10/2,100+30*3-10/2,10,10);
    painter.drawEllipse(100+30*3-10/2,100+30*11-10/2,10,10);
    painter.drawEllipse(100+30*11-10/2,100+30*3-10/2,10,10);
    painter.drawEllipse(100+30*11-10/2,100+30*11-10/2,10,10);
    painter.drawEllipse(100+30*7-10/2,100+30*7-10/2,10,10);



    //绘制棋子
    for(int i=0;i<15;i++)
        for (int j=0;j<15;j++) {
            if(dat[i][j]==1)
            {
                brush.setColor(Qt::white);
                painter.setBrush(brush);
                pen.setColor(QColor(225,225,255));
                painter.setPen(pen);
                painter.drawEllipse(100+30*i-10,100+30*j-10,20,20);
            }else if(dat[i][j]==2){
                brush.setColor(Qt::black);
                painter.setBrush(brush);
                pen.setColor(Qt::black);
                painter.setPen(pen);
                painter.drawEllipse(100+30*i-10,100+30*j-10,20,20);
            }

        }

}

void gomoku::judgeResult(int x,int y)
{
    int count=0;
    //判断横
    for(int i=x;i<15;i++)//往右走
    {
        if(i>=15) break;//越界
        if(dat[x][y] == dat[i][y])
            count++;
        if(dat[x][y] != dat[i][y])//不是同色退出
            break;
    }
    for(int i=x-1;i>=0;i--)//往左走
    {
        if(i<0) break;//越界
        if(dat[x][y] == dat[i][y])
            count++;
        if(dat[x][y] != dat[i][y])//不是同色退出
            break;
    }

    if(count<5)
    {
        count=0;
        for(int i=y;i<15;i++)//往右走
        {
            if(i>=15) break;//越界
            if(dat[x][y] == dat[x][i])
                count++;
            if(dat[x][y] != dat[x][i])//不是同色退出
                break;
        }
        for(int i=y-1;i>=0;i--)//往右走
        {
            if(i<0) break;//越界
            if(dat[x][y] == dat[x][i])
                count++;
            if(dat[x][y] != dat[x][i])//不是同色退出
                break;
        }

    }
    //左上右下
    if(count<5)
    {
        count=0;
        for(int i=x,j=y;i<15&&j<15;i++,j++)//往右走
        {
            if(i>=15||j>=15) break;//越界
            if(dat[x][y] == dat[i][j])
                count++;
            if(dat[x][y] != dat[i][j])//不是同色退出
                break;
        }
        for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--)//往右走
        {
            if(i<0||j<0) break;//越界
            if(dat[x][y] == dat[i][j])
                count++;
            if(dat[x][y] != dat[i][j])//不是同色退出
                break;
        }
    }
    //右上左下
    if(count<5)
    {
        count=0;
        for(int i=x,j=y;i<15&&j<15;i++,j--)//往右走
        {
            if(i>=15||j<=0) break;//越界
            if(dat[x][y] == dat[i][j])
                count++;
            if(dat[x][y] != dat[i][j])//不是同色退出
                break;
        }
        for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j++)//往右走
        {
            if(i<0||j>=15) break;//越界
            if(dat[x][y] == dat[i][j])
                count++;
            if(dat[x][y] != dat[i][j])//不是同色退出
                break;
        }

    }



    if(count==5)//
      QMessageBox::about(this,
                        "提示",
                        dat[x][y]==chessColor::Black?"黑方胜":"白方胜");
}


void gomoku::on_pushButton_clicked()//黑棋
{
    int x=ui->sp_x->value();
    int y=ui->sp_y->value();
    if(isBLACK&&(dat[x-1][y-1]==chessColor::None))
    {
        dat[x-1][y-1]=chessColor::Black;
        isBLACK=false;
    }
        update();
}

void gomoku::on_pushButton_2_clicked()//白棋
{
    int x=ui->sp_x->value();
    int y=ui->sp_y->value();
    if(!isBLACK&&(dat[x-1][y-1]==chessColor::None))
    {
        dat[x-1][y-1]=chessColor::White;
       isBLACK=true;
    }
    update();
}

void gomoku::on_pushButton_3_clicked()//清除
{
    initData();
    update();
}

    void gomoku::ReadInfo()
    {
        QString datArray = tcpSocket->readAll();
        QString temp=QString(datArray);
        QStringList pos= temp.split(',');
        if(pos.length()==3)
{
         QString x = pos.at(0);
         QString y = pos.at(1);
         QString c= pos.at(2);


        if(dat[x.toInt()][y.toInt()]==chessColor::None)
        {
            dat[x.toInt()][y.toInt()]=chessColor::White;
            isBLACK=true;
        }
        judgeResult(x.toInt(),y.toInt());
        update();//重写绘制
}
}
    void gomoku::connected()
    {
     ui->pushButton_4->setEnabled(false);
     isChess=true;
    }


void gomoku::on_pushButton_4_clicked()//普通玩家
{
    tcpSocket =new QTcpSocket;
    connect(tcpSocket,&QTcpSocket::connected,this,&gomoku::connected);
    connect(tcpSocket,&QTcpSocket::readyRead,this,&gomoku::ReadInfo);

    QString url="127.0.0.1";
    int port=17522;
    tcpSocket->connectToHost(url,port);
    tcpSocket->waitForConnected(1000);
}

void gomoku::WriteInfo(int x,int y,int z)
{
  QString temp=QString("%1,%2,%3").arg(x).arg(y).arg(z);
  tcpSocket->write(temp.toLocal8Bit());
}
